package com.wyp168.leetcode.listnode;

/**
 * @ClassName HasCycle
 * @Description TODO
 * @Author wyp168
 * @Date 2022/6/23 11:42
 */
public class HasCycle {

    public static void main(String[] args) {
        ListNode ln1 = new ListNode(1);
        ListNode ln2 = new ListNode(2);
        ln1.next = ln2;

        System.out.println(hasCycle(ln1));
    }

    /**
     * 判断链表是否有环 的方法 （一、Set集合的形式）
     * @param head
     * @return
     */
//    public static boolean hasCycle(ListNode head) {
//        Set<ListNode> set = new HashSet<>();
//
//        while (head != null) {
//
//            //判断set集合中是否有该元素节点，如果有，则说明该链表中有环
//            if (set.contains(head)) {
//                return true;
//            }
//            set.add(head);
//            head = head.next;
//        }
//        return false;
//    }

    
    /** 
     * @description: 判断链表是否有环 的方法 （二、快慢指针的方式）
     * @author wyp168
     * @date: 2022/6/23 11:49
     */ 
    
    public static boolean hasCycle(ListNode head) {
        if (head == null) {
            return false;
        }
        ListNode fast = head;
        ListNode slow = head;
        while (fast!= null && fast.next != null) {
            fast = fast.next.next;
            slow = slow.next;

            if (fast == slow) {
                return true;
            }

        }
        return false;
    }
}
